import useUserStore from '@/store/modules/user'
import {
	getToken
} from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import {
	tansParams
} from '@/utils/common'
import checkappupdate from '@/plugins/update/checkAppUpdate.js'
import modal from '@/plugins/modal.js'
let timeout = 1000*60*3
//H5支持代理，APP不支持需要设置url地址
// #ifdef APP-PLUS
const baseUrl = import.meta.env.VITE_APP_API_HOST
// #endif
// #ifdef H5
const baseUrl = import.meta.env.VITE_APP_BASE_API
// #endif

/**
 * 通用请求封装
 * @param {object} config 参数
 * @param {object} config.headers 请求头
 * @param {boolean} config.headers.isToken 是否添加token
 * @param {object} config.header 请求头
 * @param {string} config.baseUrl 有值则访问当前地址
 * @param {string} config.url baseUrl+url做为访问地址
 * @param {'GET'|'POST'|'PUT'|'DELETE'}[config.method='GET'] config.method baseUrl+url做为访问地址
 * @param {number}[config.timeout=1000*60*3]  config.timeout 超时时间
 * @param {object} config.data 数据
 */
const request = config => {
	// 是否需要设置 token
	const isToken = (config.headers || {}).isToken === false
	config.header = config.header || {}
	if (getToken() && !isToken) {
		config.header['Authorization'] = 'Bearer ' + getToken()
	}
	// get请求映射params参数
	if (config.params) {
		let url = config.url + '?' + tansParams(config.params)
		url = url.slice(0, -1)
		config.url = url
	}
	return new Promise((resolve, reject) => {
		uni.request({
				method: config.method || 'get',
				timeout: config.timeout || timeout,
				url: config.baseUrl || baseUrl + config.url,
				data: config.data,
				header: config.header,
				dataType: 'json'
			}).then(response => {
				// vue3 不再返回数组结构，失败直接进 catch
				let res = response
				const code = res.data.code || 200
				const msg = errorCode[code] || res.data.msg || errorCode['default']
				if (code === 401) {
					modal.confirm(uni.$lang('警告'), uni.$lang('登录状态已过期，您可以继续留在该页面，或者重新登录?')).then(
					res => {
						useUserStore().LogOut().then(res => {
							uni.reLaunch({
								url: '/pages/login'
							})
						})
					})
					reject(uni.$lang('无效的会话，或者会话已过期，请重新登录'))
				} else if (code === 500) {
					modal.msgError(msg)
					reject('500')
				} else if (code !== 200) {
					modal.msgError(msg)
					reject(res.data)
				}
				resolve(res.data)
			})
			.catch(error => {
				let {
					errMsg,message
				} = error
				message=message||errMsg
				console.log(message)
				if (message === 'Network Error') {
					message = uni.$lang('后端接口连接异常')
				} else if (message.includes('timeout')) {
					message = uni.$lang('系统接口请求超时')
				} else if (message.includes('Request failed with status code')) {
					message = uni.$lang('系统接口{0}异常', [message.substr(message.length - 3)])
				}
				modal.msgError(message)
				reject(error)
			}).finally(() => {
				// #ifdef APP-PLUS
				//检验版本更新
				checkappupdate.check({
					api: '/system/UpdateConfig'
				})
				// #endif
			})
	})
}

export default request